for(int i = 1; i <= 20; i++){//先枚举2的i次方
    for(int j = 1; j <= n; j++){//再枚举每一个位置
        if(f[i - 1][j] + 1 >= n) f[i][j] = n;
        else f[i][j] = f[i - 1][f[i - 1][j] + 1];
    }
}

int ans = 0;
for(int i = 1; i <= n; i ++)
{
    int pos = i - 1;
    for(int j = 20; j >= 0; j --)
    {
        int k = m & (1 << j);//如果可以拆分为2的j次方
        if(k) pos = f[j][pos + 1];
        if(pos == n) break;
    }
    ans = max(ans,pos - i + 1);
}